<?php

// TTTTTTTTTTTTTTTTTTTTTTT                  MMMMMMMM               MMMMMMMM                                CCCCCCCCCCCCMMMMMMMM               MMMMMMMM  SSSSSSSSSSSSSSS 
// T:::::::::::::::::::::T                  M:::::::M             M:::::::M                             CCC::::::::::::M:::::::M             M:::::::MSS:::::::::::::::S
// T:::::::::::::::::::::T                  M::::::::M           M::::::::M                           CC:::::::::::::::M::::::::M           M::::::::S:::::SSSSSS::::::S
// T:::::TT:::::::TT:::::T                  M:::::::::M         M:::::::::M                          C:::::CCCCCCCC::::M:::::::::M         M:::::::::S:::::S     SSSSSSS
// TTTTTT  T:::::T  TTTTTppppp   ppppppppp  M::::::::::M       M::::::::::M   eeeeeeeeeeee          C:::::C       CCCCCM::::::::::M       M::::::::::S:::::S            
//         T:::::T       p::::ppp:::::::::p M:::::::::::M     M:::::::::::M ee::::::::::::ee       C:::::C             M:::::::::::M     M:::::::::::S:::::S            
//         T:::::T       p:::::::::::::::::pM:::::::M::::M   M::::M:::::::Me::::::eeeee:::::ee     C:::::C             M:::::::M::::M   M::::M:::::::MS::::SSSS         
//         T:::::T       pp::::::ppppp::::::M::::::M M::::M M::::M M::::::e::::::e     e:::::e     C:::::C             M::::::M M::::M M::::M M::::::M SS::::::SSSSS    
//         T:::::T        p:::::p     p:::::M::::::M  M::::M::::M  M::::::e:::::::eeeee::::::e     C:::::C             M::::::M  M::::M::::M  M::::::M   SSS::::::::SS  
//         T:::::T        p:::::p     p:::::M::::::M   M:::::::M   M::::::e:::::::::::::::::e      C:::::C             M::::::M   M:::::::M   M::::::M      SSSSSS::::S 
//         T:::::T        p:::::p     p:::::M::::::M    M:::::M    M::::::e::::::eeeeeeeeeee       C:::::C             M::::::M    M:::::M    M::::::M           S:::::S
//         T:::::T        p:::::p    p::::::M::::::M     MMMMM     M::::::e:::::::e                 C:::::C       CCCCCM::::::M     MMMMM     M::::::M           S:::::S
//       TT:::::::TT      p:::::ppppp:::::::M::::::M               M::::::e::::::::e                 C:::::CCCCCCCC::::M::::::M               M::::::SSSSSSS     S:::::S
//       T:::::::::T      p::::::::::::::::pM::::::M               M::::::Me::::::::eeeeeeee          CC:::::::::::::::M::::::M               M::::::S::::::SSSSSS:::::S
//       T:::::::::T      p::::::::::::::pp M::::::M               M::::::M ee:::::::::::::e            CCC::::::::::::M::::::M               M::::::S:::::::::::::::SS 
//       TTTTTTTTTTT      p::::::pppppppp   MMMMMMMM               MMMMMMMM   eeeeeeeeeeeeee               CCCCCCCCCCCCMMMMMMMM               MMMMMMMMSSSSSSSSSSSSSSS   
//                        p:::::p                                                                                                                                       
//                        p:::::p                                                                                                                                       
//                       p:::::::p                                                                                                                                      
//                       p:::::::p                                                                                                                                      
//                       p:::::::p                                                                                                                                      
//                       ppppppppp                                                                                                                                      

//  _____      __  __         ____ __  __ ____  
// |_   __ __ |  \/  | ___   / ___|  \/  / ___|     | AUTHOR: Xiaohe
//   | || '_ \| |\/| |/ _ \ | |   | |\/| \___ \     | EMAIL: 496631085@qq.com
//   | || |_) | |  | |  __/ | |___| |  | |___) |    | WECHAT: he4966
//   |_|| .__/|_|  |_|\___|  \____|_|  |_|____/     | DATETIME: 2022/05/20
//      |_|                                         | TpMeCMS

declare(strict_types=1);

namespace ImiApp\ApiServer\Api\Controller\run;

use Imi\Db\Db;
use Imi\Server\Http\Route\Annotation\Action;
use Imi\Server\Http\Route\Annotation\Controller;
use Imi\Server\Http\Route\Annotation\Route;
use Psr\Http\Message\ResponseInterface;
use Imi\Aop\Annotation\Inject;
// use Phpben\Imi\Validate\Annotation\Validate;
use ImiApp\ApiServer\Common\AuthApi;
use ImiApp\ApiServer\Api\Controller\Tpmecms;

/**
 * 运营中心
 * 
 */
class RunBean extends Tpmecms
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    protected $run;
    protected $run_id;
    public function init(?int $user_id = null)
    {
        if (!$user_id)
            $user_id = $this->auth->user()->id;
        $run = Db::name('run')->where('user_id', '=', $user_id)->find();
        if (!$run)
            throw new \Exception("非运营中心", -1);
        $this->run = (object)$run;
        $this->run_id = $run['id'];
    }

    protected $str = '';
    protected $array = [];

    public function 合并($str = null)
    {
        // if ($str) {
        //     $this->str = $this->str . '👉' . $str;
        // }
        // // var_dump($this->str);
        if ($str) {
            if (!in_array($str, $this->array)) {
                $this->array[] = $str;
            }
        }
    }

    public function 获取系统分配人员列表($run_id)
    {
        $list = Db::name('run_bonus_user_sys')->where('run_id', '=', $run_id)->select()->getArray();
        return $list;
    }



    public function 获取分配人员列表($run_id)
    {
        $list = Db::name('run_bonus_user')->where('run_id', '=', $run_id)->select()->getArray();
        return $list;
    }


    public function 获取分配人员和比例列表($run_id)
    {
        $list = $this->获取分配人员列表($run_id);
        foreach ($list as $key => &$user) {
            $user['ratio'] = Db::name('run_bonus_ratio')->where('run_id','=',$run_id)->where('weigh', '=', $key + 1)->value('ratio');
        }
        return $list;
    }
    

    //公共方法**************************************************************************************************



    public function 本月消费总额($run_id, $date)
    {
        //_K
        // $money = 410000;
        list($开始时间, $结束时间) = $this->GetMonthTime($date);
        $money = $this->运营中心下用户消费额($run_id, $开始时间, $结束时间);
        $this->合并('本月消费总额' . $money);
        return $money;
    }


    public function 上月消费总额($run_id, $date)
    {
        //_J
        // $money = 300000;
        list($开始时间, $结束时间) = $this->GetMonthTime(date('Y-m', strtotime('last month', strtotime($date))));
        $money = $this->运营中心下用户消费额($run_id, $开始时间, $结束时间);
        $this->合并('上月消费总额' . $money);
        return $money;
    }

    public function 后台设置的激励金发放比例($run_id)
    {
        //_E
        $this->合并('后台设置的激励金发放比例100%');
        return 1;
    }

    public function 上月营业总额($run_id, $date)
    {
        //_P
        // $money = 250000;
        list($开始时间, $结束时间) = $this->GetMonthTime(date('Y-m', strtotime('last month', strtotime($date))));
        $money = $this->运营中心下店铺销售额($run_id, $开始时间, $结束时间);
        $this->合并('上月营业总额' . $money);
        return $money;
    }


    public function 本月营业总额($run_id, $date)
    {
        //_Q
        // $money = 330000;
        list($开始时间, $结束时间) = $this->GetMonthTime($date);
        $money = $this->运营中心下店铺销售额($run_id, $开始时间, $结束时间);
        $this->合并('本月营业总额' . $money);
        return $money;
    }



    public function 上月累计激励金($run_id, $date = null)
    {
        //_D
        //测试用 实际用 获取运营中心上月累计激励金()
        // $money = 30000;
        $money = $this->获取运营中心上月累计激励金($run_id, $date);
        $this->合并('上月累计激励金' . $money);
        return $money;
    }

    public function 本月累计激励金($run_id, $date = null)
    {
        //_H
        //测试用 实际用 获取运营中心上月累计激励金()
        // $money = 2000.99;
        // $money = 48000;
        $date = date('Y-m', strtotime($date));
        $money = Db::name('run_excite_money')->where('run_id', '=', $run_id)->where('date', '=', $date)->value('money') ?? 0;
        $this->合并('本月累计激励金' . $money);
        return $money;
    }


    public function 消费占比($run_id, $date = null)
    {
        //_L
        //测试用 消费占比   
        $ratio = 0.6; //60%
        $this->合并('消费占比' . $ratio);
        return $ratio;
    }

    public function 营业占比($run_id, $date = null)
    {
        //_R
        //测试用 营业占比
        $ratio = 0.4; //40%
        $this->合并('消费占比' . $ratio);
        return $ratio;
    }






    //以上是参与变动的变量 下面是参与运算的函数









    public function 运营中心获取用户分配当前收益($run_id, $date, $ratio)
    {

        $money = $this->排名用户分配占比金额($run_id, $date, $ratio);

        var_dump($this->str);
        return $money;
    }



    public function 获取运营中心上月累计激励金($run_id, $date = null)
    {
        if (!$date) {
            $date = date('Y-m');
        }

        $money = Db::name('run_excite_money')->where('run_id', '=', $run_id)->where('date', '=', $date)->value('money') ?? 0;
        $this->合并('获取运营中心' . $run_id . '上月' . $date . '累计激励金' . $money);
        return $money;
    }




    public function 当前激励金发放比例($run_id, $date)
    {
        //_F

        // =IF((M5+S5)/2*E5>100%,100%,(M5+S5)/2*E5)

        //(消费增长率+营业增长率)/2*后台设置的激励金发放比例
        // if(消费增长率+营业增长率)/2*后台设置的激励金发放比例>1  return 1, else 



        $_消费增长率 = $this->消费增长率($run_id, $date);

        $_营业增长率 = $this->营业增长率($run_id, $date);

        $_比例 = ($_消费增长率 + $_营业增长率) / 2 * $this->后台设置的激励金发放比例($run_id);

        if ($_比例 >= 1) {
            $比例  = 1;
        } else {
            $比例 = $_比例;
        }
        $this->合并('当前激励金发放比例' . $_比例 . '实际' . $比例);
        return $比例;
    }



    public function 消费增长率($run_id, $date)
    {
        //_M
        $_本月消费总额 = $this->本月消费总额($run_id, $date);
        $_上月消费总额 = $this->上月消费总额($run_id, $date);
        if ($_上月消费总额 > 0) {
            $比例 = $_本月消费总额 / $_上月消费总额;
        } else {
            $比例 = 0;
        }

        $this->合并('消费增长率' . $比例);
        return $比例;
    }


    public function 营业增长率($run_id, $date)
    {
        //_S
        // =Q5/P5
        $本月营业总额 = $this->本月营业总额($run_id, $date);
        $上月营业总额 = $this->上月营业总额($run_id, $date);
        if ($上月营业总额 > 0) {
            $比例 = $本月营业总额 / $上月营业总额;
        } else {
            $比例 = 0;
        }

        $this->合并('营业增长率' . $比例);
        return $比例;
    }




    public function 待分配激励金($run_id, $date)
    {
        //_G


        // =IF((M5+S5)/2*F5*D5>D5,D5,(M5+S5)/2*F5*D5)



        //(消费增长率+营业增长率)/2*后台设置的激励金发放比例
        // if(消费增长率+营业增长率)/2*后台设置的激励金发放比例>1  return 1, else 



        $_消费增长率 = $this->消费增长率($run_id, $date);

        $_营业增长率 = $this->营业增长率($run_id, $date);

        $当前激励金发放比例 = $this->当前激励金发放比例($run_id, $date); //F
        $上月累计激励金 = $this->上月累计激励金($run_id, $date); //D

        $_结果 = ($_消费增长率 + $_营业增长率) / 2 * $当前激励金发放比例 * $上月累计激励金;

        if ($_结果 > $上月累计激励金) {
            $结果  = $上月累计激励金;
        } else {
            $结果 =  $_结果;
        }
        $this->合并('待分配激励金' . $_结果 . '实际' . $结果);
        return $结果;
    }


    public function 激励金结余($run_id, $date)
    {
        //_I

        // =_D-_O-_U

        $上月累计激励金 = $this->上月累计激励金($run_id, $date); //D
        $当前收益_消费 = $this->当前收益_消费($run_id, $date); //O
        $当前收益_营业 = $this->当前收益_营业($run_id, $date); //U
        $money = $上月累计激励金 - $当前收益_消费 - $当前收益_营业;
        $this->合并('激励金结余' . $money);
        return $money;
    }


    public function 当前收益_消费($run_id, $date)
    {
        //_O
        // =_G*_L*_N

        $待分配激励金 = $this->待分配激励金($run_id, $date); //G
        $消费占比 = $this->消费占比($run_id, $date); //L
        $发放比例 = $this->获取消费发放比例($run_id, $date); //N
        //=IFERROR(VLOOKUP(M5,消费发放比例!A1:B9,2),0)
        $money = $待分配激励金 * $消费占比 * $发放比例;
        $this->合并('当前收益_消费' . $money);
        return $money;
    }
    // 
    public function 当前收益_营业($run_id, $date)
    {
        //_U
        //=_G*_R*_T

        $待分配激励金 = $this->待分配激励金($run_id, $date); //G
        $营业占比 = $this->营业占比($run_id, $date); //R
        $获取营业发放比例 = $this->获取营业发放比例($run_id, $date); //T

        $money = $待分配激励金 * $营业占比 * $获取营业发放比例;
        $this->合并('当前收益_营业' . $money);
        return $money;
    }


    public function 固定用户分配占比金额($run_id, $date, $ratio)
    {
        //_W
        //=(O+U)*V

        $当前收益_消费 = $this->当前收益_消费($run_id, $date); //O
        $当前收益_营业 = $this->当前收益_营业($run_id, $date); //U
        $money = ($当前收益_消费 + $当前收益_营业) * $ratio;
        $this->合并('固定用户分配占比金额' . $money);
        return $money;
    }


    public function 排名用户分配占比金额($run_id, $date, $ratio)
    {
        //_AB
        //=(O+U)*比例

        $当前收益_消费 = $this->当前收益_消费($run_id, $date); //O
        $当前收益_营业 = $this->当前收益_营业($run_id, $date); //U
        $money = ($当前收益_消费 + $当前收益_营业) * $ratio;
        $this->合并('排名用户分配占比金额' . $money);
        return $money;
    }







    public function 获取消费发放比例($run_id, $date)
    {
        //_N

        $消费增长率 =  $this->消费增长率($run_id, $date);

        $消费增长率 = $消费增长率 * 100;
        var_dump('获取消费发放比例——对比——消费增长率' . $消费增长率);
        $run = Db::name('run')->where('id', '=', $run_id)->find();

        var_dump($run);
        $比例 = 0;
        for ($i = 1; $i <= 4; $i++) {
            //
            var_dump('consume_inc_ratio' . $i, $run['consume_inc_ratio' . $i]);
            list($符号, $数字) = $this->获取符号($run['consume_inc_ratio' . $i]);
            switch ($符号) {
                case '<=':
                    if ($消费增长率 <= $数字) {
                        $比例 = $run['consume_send_ratio' . $i];
                    }
                    break;

                case '<':
                    if ($消费增长率 < $数字) {
                        $比例 = $run['consume_send_ratio' . $i];
                    }
                    break;

                case '>=':

                    if ($消费增长率 >= $数字) {
                        $比例 = $run['consume_send_ratio' . $i];
                    }
                    break;


                case '>':
                    if ($消费增长率 > $数字) {
                        $比例 = $run['consume_send_ratio' . $i];
                    }
                    break;

                case '=':
                    if ($消费增长率 == $数字) {
                        $比例 = $run['consume_send_ratio' . $i];
                    }
                    break;


                default:

                    break;
            }
        }
        if ($比例 > 0) {
            $比例 =  $比例 / 100;
        }

        var_dump('获取消费发放比例', $比例);
        return $比例;
    }




    public function 获取营业发放比例($run_id, $date)
    {
        //_T

        $营业增长率 =  $this->营业增长率($run_id, $date);

        $营业增长率 = $营业增长率 * 100;
        var_dump('获取营业发放比例——对比——营业增长率' . $营业增长率);
        $run = Db::name('run')->where('id', '=', $run_id)->find();
        $比例 = 0;
        for ($i = 1; $i <= 4; $i++) {
            //
            // var_dump($i,$run['trade_inc_ratio' . $i]);
            list($符号, $数字) = $this->获取符号($run['trade_inc_ratio' . $i]);
            switch ($符号) {
                case '<=':
                    if ($营业增长率 <= $数字) {
                        $比例 = $run['trade_send_ratio' . $i];
                    }
                    break;

                case '<':
                    if ($营业增长率 < $数字) {
                        $比例 = $run['trade_send_ratio' . $i];
                    }
                    break;

                case '>=':

                    if ($营业增长率 >= $数字) {
                        $比例 = $run['trade_send_ratio' . $i];
                    }
                    break;


                case '>':
                    if ($营业增长率 > $数字) {
                        $比例 = $run['trade_send_ratio' . $i];
                    }
                    break;

                case '=':
                    if ($营业增长率 == $数字) {
                        $比例 = $run['trade_send_ratio' . $i];
                    }
                    break;


                default:

                    break;
            }
        }
        if ($比例 > 0) {
            $比例 =  $比例 / 100;
        }

        var_dump('获取营业发放比例', $比例);
        return $比例;
    }

    public function 获取符号($str)
    {

        $符号 = false;
        $找到 = false;
        $数字 = 0;

        if (!$找到) {
            $pos = strpos($str, "<=");
            if ($pos === false) {
            } else {
                $找到 = true;
                $符号 = '<=';
            }
        }
        if (!$找到) {
            $pos = strpos($str, "<");
            if ($pos === false) {
            } else {
                $找到 = true;
                $符号 = '<';
            }
        }
        if (!$找到) {
            $pos = strpos($str, ">=");
            if ($pos === false) {
            } else {
                $找到 = true;
                $符号 = '>=';
            }
        }
        if (!$找到) {
            $pos = strpos($str, ">");
            if ($pos === false) {
            } else {
                $找到 = true;
                $符号 = '>';
            }
        }

        if (!$找到) {
            $pos = strpos($str, "=");
            if ($pos === false) {
            } else {
                $找到 = true;
                $符号 = '=';
            }
        }


        $arr = explode($符号, $str);
        var_dump($符号, $arr);
        $数字字符 = $arr[1];
        $数字 = trim($数字字符, '%');

        var_dump('获取符号' . $str, $符号, $数字);
        return [$符号, $数字];
    }




    // 
}
